# 作者: Mark
# 2023年03月07日22时39分03秒
from socket import *
import select
import sys

#1 初始化一个套接字
tcp_server_socket = socket(AF_INET,SOCK_STREAM)

#重用对应地址和端口
tcp_server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

#2 绑定信息
tcp_server_socket.bind(("",2000))
#3 listen 端口激活了
tcp_server_socket.listen(10)

client_socket ,client_addr= tcp_server_socket.accept()
print(f"{client_addr}连接上了")

#创建一个epoll对象
linux_epoll = select.epoll()
#先使用epoll帮助监听标准输入的数据 在input的缓冲区
#此缓冲区在内核的进程地址空间中
#fileno()是表示在在内核地址中的标准输入的数据的文件描述符的接口
#sys.stdin.fileno()文件描述符
#select.EPOLLIN 可读事件
linux_epoll.register(sys.stdin.fileno(),select.EPOLLIN)
#在使用eppll帮我们监听来自client_socket的数据  在recv的缓冲区
#client_socket.fileno()文件描述符
linux_epoll.register(client_socket.fileno(),select.EPOLLIN)






while True:
     #-1永久等待,2监听了两个
     events = linux_epoll.poll(-1,2)
     #通过epoll的这种监听机制即时聊天的send和recv就不会卡住了 因为epoll帮助其判断
     for event in events:
          if event[0]==sys.stdin.fileno(): #代表标准输入缓冲区可读了
               input_data = input()
               client_socket.send(input_data.encode('utf8'))
          elif event[0]==client_socket.fileno():  #代表client_socket接收缓冲区可读了
               recv_data = client_socket.recv(1000)
               if recv_data:

                   print(recv_data.decode("utf8"))
               else:#如果没有从缓冲区读到数据，就是对端断开了
                    print("拜拜！")
                    client_socket.close()
                    tcp_server_socket.close()
                    exit(0)










